/*
 * Copyright (c) 2003-2010, Live Media Pty. Ltd.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice, this list of
 *     conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice, this list of
 *     conditions and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *  3. Neither the name of Live Media nor the names of its contributors may be used to endorse
 *     or promote products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.colony.channel;

import java.io.InputStream;
import java.io.OutputStream;

import com.argot.ResourceDictionaryLoader;
import com.argot.TypeException;
import com.argot.TypeLibrary;
import com.argot.TypeMap;
import com.argot.auto.TypeReaderAuto;
import com.argot.auto.TypeSimpleReader;
import com.argot.auto.TypeSimpleWriter;
import com.argot.remote.transport.TypeEndPoint;
import com.colony.channel.types.ChannelInputStreamClientReader;
import com.colony.channel.types.ChannelInputStreamClientWriter;
import com.colony.channel.types.ChannelInputStreamServerReader;
import com.colony.channel.types.ChannelInputStreamServerWriter;
import com.colony.channel.types.ChannelInvalidReader;
import com.colony.channel.types.ChannelInvalidWriter;
import com.colony.channel.types.ChannelOutputStreamClientReader;
import com.colony.channel.types.ChannelOutputStreamClientWriter;
import com.colony.channel.types.ChannelOutputStreamServerReader;
import com.colony.channel.types.ChannelOutputStreamServerWriter;
import com.colony.channel.types.ChannelPipeClientReader;
import com.colony.channel.types.ChannelPipeClientWriter;
import com.colony.channel.types.ChannelPipeServerReader;
import com.colony.channel.types.ChannelPipeServerWriter;

public class ChannelLoader
extends ResourceDictionaryLoader
{
	public static final String CHANNEL_INPUT = "channel.input";
	public static final String CHANNEL_OUTPUT = "channel.output";
	public static final String CHANNEL_PIPE = "channel.pipe";

	public static final String DICTIONARY = "channel.dictionary";
	
	public ChannelLoader()
	{
		super( DICTIONARY );
	}
	
	public String getName()
	{
		return DICTIONARY;
	}
	
	public void bind( TypeLibrary library )
	throws TypeException
	{
		library.bind( library.getTypeId(ChannelIdentifier.TYPENAME,"1.3"),
				new TypeReaderAuto( ChannelIdentifier.class ),
				new TypeSimpleWriter(new ChannelIdentifier.ChannelIdentifierTypeWriter()),
				ChannelIdentifier.class);
		
		library.bind( library.getTypeId(CHANNEL_INPUT, "1.3"), 
				new TypeSimpleReader(new ChannelInvalidReader()),
				new TypeSimpleWriter(new ChannelInvalidWriter()),
				InputStream.class);
		
		library.bind( library.getTypeId(CHANNEL_OUTPUT, "1.3"),
				new TypeSimpleReader(new ChannelInvalidReader()),
				new TypeSimpleWriter(new ChannelInvalidWriter()),
				OutputStream.class );
		
		library.bind( library.getTypeId(CHANNEL_PIPE, "1.3"),
				new TypeSimpleReader(new ChannelInvalidReader()),
				new TypeSimpleWriter(new ChannelInvalidWriter()),				
				TypeEndPoint.class);
		
		library.addClassAlias( library.getTypeId(CHANNEL_PIPE,"1.3"), Channel.class);
	}
	
	public static void bindClientMap( TypeMap map, ChannelClient client )
	throws TypeException
	{
		int inputId = map.getStreamId(CHANNEL_INPUT);
		map.setReader( inputId, new ChannelInputStreamClientReader(client));
		map.setWriter( inputId, new ChannelInputStreamClientWriter(client));
		
		int outputId = map.getStreamId(CHANNEL_OUTPUT);
		map.setReader( outputId, new ChannelOutputStreamClientReader(client));
		map.setWriter( outputId, new ChannelOutputStreamClientWriter(client));

		int pipeId = map.getStreamId(CHANNEL_PIPE);
		map.setReader( pipeId, new ChannelPipeClientReader(client));
		map.setWriter( pipeId, new ChannelPipeClientWriter(client));
	}
	
	public static void bindServerMap( TypeMap map, ChannelServer server )
	throws TypeException
	{
		int inputId = map.getStreamId(CHANNEL_INPUT);
		map.setReader( inputId, new ChannelInputStreamServerReader(server));
		map.setWriter( inputId, new ChannelInputStreamServerWriter(server));
		
		int outputId = map.getStreamId(CHANNEL_OUTPUT);
		map.setReader( outputId, new ChannelOutputStreamServerReader(server));
		map.setWriter( outputId, new ChannelOutputStreamServerWriter(server));		

		int pipeId = map.getStreamId(CHANNEL_PIPE);
		map.setReader( pipeId, new ChannelPipeServerReader(server));
		map.setWriter( pipeId, new ChannelPipeServerWriter(server));		
	}
}
